public class PlayerCrouchMoveState : PlayerGroundState
{
    public PlayerCrouchMoveState(Player player, PlayerSM stateMachine, PlayerData playerData, string animBoolName,
        Core core) : base(player, stateMachine, playerData, animBoolName, core)
    {
    }

    public override void Enter()
    {
        base.Enter();

        _player.SetCollisionHeight(_playerData._crouchCollisionHeight);
    }

    public override void Exit()
    {
        base.Exit();
    }

    public override void LogicUpdate()
    {
        base.LogicUpdate();

        if (!_isExitingState)
        {
            _core.Movement.SetVelocityX(_playerData._crouchMoveVelocity * _inputX);
            _core.Movement.CheckIfShouldFilp(_inputX);

            if (_inputX == 0)
            {
                _stateMachine.ChangeState(_player.CrouchIdleState);
            }
            else if (_inputY >= 0 && !_isTouchingCeiling)
            {
                _player.SetCollisionHeight(_playerData._standCollisionHeiht);
                _stateMachine.ChangeState(_player.MoveState);
            }
        }
    }
}